﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpDwgDxfInterface.h"
#include "Vector3d.h"
#include "ElementId.h"
#include "ICADDimensionStyle.h"

namespace gcmp
{
    /// \brief 标注类型
    enum class DimensionType : int32_t
    {
        Liner = 0,   ///< 线性标注
        Arc = 1,         ///< 圆弧标注
        Radius = 2,      ///< 半径标注
        Diameter = 3    ///< 直径标注
    };

    /// \brief 文字移动类型
    enum class DimensionTextMoveType : int32_t
    {
        DimLineByText = 0,   ///< 尺寸线随文字移动
        AddLeadLine = 1,     ///< 移动文字时添加引线
        NotAddLeadLine = 2,  ///< 移动文字时不添加引线
    };

    /// \brief 标注对象基类
    class GCMP_DWG_DXF_INTERFACE_EXPORT ICADDimension
    {
    public:
        /// \brief 设置样式名字
        /// \param styleName 样式名字
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetStyleName(const std::wstring& styleName) = 0;

        /// \brief 获取样式名字
        /// \return 返回样式名字
        virtual std::wstring GetStyleName() const = 0;

        /// \brief 设置标注所属的id
        /// \param elementId 构件id
        virtual void SetElementId(const ElementId& elementId) = 0;

        /// \brief 获取标注所属的id
        /// \return 返回标注所属的id
        virtual ElementId GetElementId() const = 0;

        /// \brief 设置文字样式名字
        /// \param styleName 文字样式名字
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetTextStyleName(const std::wstring& textStyleName) = 0;

        /// \brief 获取文字样式名字
        /// \return 返回文字样式名字
        virtual std::wstring GetTextStyleName() const = 0;

        /// \brief 获取标注类型
        /// \return 返回标注类型
        virtual DimensionType GetDimensionType() const = 0;

        /// \brief 获取文字替代内容
        /// \return 返回文字替代内容
        virtual std::wstring GetTextContent() const = 0;

        /// \brief 设置文字点
        /// \param textPoint 文字点
        virtual void SetTextPoint(const Vector3d& textPoint) = 0;

        /// \brief 获取文字点
        /// \return 返回文字点
        virtual Vector3d GetTextPoint() const = 0;

        /// \brief 设置文字移动类型
        /// \param textPoint 文字移动类型
        virtual void SetTextMoveType(const DimensionTextMoveType& textMoveType) = 0;

        /// \brief 获取文字移动类型
        /// \return 返回文字移动类型
        virtual DimensionTextMoveType GetTextMoveType() const = 0;

        /// \brief 设置文字替代内容
        /// \param textContent 文字替代内容
        /// \return 
        virtual void SetTextContent(const std::wstring& textContent) = 0;

        /// \brief 设置标注文字颜色
        /// \param textColor 文字颜色
        /// \return 
        virtual void SetTextColor(Color textColor) = 0;

        /// \brief 获取标注文字颜色
        /// \return 返回标注文字颜色
        virtual Color GetTextColor() const = 0;

        /// \brief 设置标注文字颜色索引值
        /// \param textColorIndex 文字颜色索引值
        /// \return 
        virtual void SetTextColorIndex(int textColorIndex) = 0;

        /// \brief 获取标注文字颜色索引值
        /// \return 返回标注文字颜色索引值
        virtual int GetTextColorIndex() const = 0;

        /// \brief 设置标注尺寸线线型名字
        /// \param lineTypeName 线型名称
        /// \return 
        virtual void SetDimensionLineType(const std::wstring& lineTypeName) = 0;

        /// \brief 获取标注尺寸线线型名称
        /// \return 返回标注尺寸线线型名称
        virtual std::wstring GetDimensionLineType() const = 0;

        /// \brief 设置标注尺寸界线1线型
        /// \param ext1LineTypeName 线型名称
        /// \return 
        virtual void SetDimensionExt1LineType(const std::wstring& ext1LineTypeName) = 0;

        /// \brief 获取标注尺寸界线1线型名称
        /// \return 返回标注尺寸界线1线型名称
        virtual std::wstring GetDimensionExt1LineType() const = 0;

        /// \brief 设置标注尺寸界线2线型
        /// \param ext2LineTypeName 线型名称
        /// \return 
        virtual void SetDimensionExt2LineType(const std::wstring& ext2LineTypeName) = 0;

        /// \brief 获取标注尺寸界线2线型名称
        /// \return 返回标注尺寸界线2线型名称
        virtual std::wstring GetDimensionExt2LineType() const = 0;

    public:
        virtual ~ICADDimension();
    };

    /// \brief 线型标注对象
    class GCMP_DWG_DXF_INTERFACE_EXPORT IAlignedCADDimension : public ICADDimension
    {
    public:
        static OwnerPtr<IAlignedCADDimension> Create();

    public:
        /// \brief 设置起点
        /// \param startPoint 起点
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetStartPoint(const Vector3d& startPoint) = 0;

        /// \brief 获取起点
        /// \return 返回起点
        virtual Vector3d GetStartPoint() const = 0;

        /// \brief 设置终点
        /// \param startPoint 终点
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetEndPoint(const Vector3d& endPoint) = 0;

        /// \brief 获取终点
        /// \return 返回终点
        virtual Vector3d GetEndPoint() const = 0;

        /// \brief 设置尺寸线的位置
        /// \param dimLinePoint 尺寸线的点
        virtual void SetDimLinePoint(const Vector3d& dimLinePoint) = 0;

        /// \brief 获取尺寸线位置点
        /// \return 返回尺寸线的点位置
        virtual Vector3d GetDimLinePoint() const = 0;

        /// \brief 设置文字高
        /// \param textHeight 文字高
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetTextHeight(double textHeight) = 0;

        /// \brief 获取文字高
        /// \return 返回文字高
        virtual double GetTextHeight() const = 0;

        /// \brief 设置文字偏移
        /// \param offset 文字偏移
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetTextOffset(double offset) = 0;

        /// \brief 获取文字偏移
        /// \return 返回文字偏移
        virtual double GetTextOffset() const = 0;

        /// \brief 设置尺寸线线宽
        /// \param dimensionWidth 尺寸线线宽
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetDimensionLineWidth(LineWidth dimensionWidth) = 0;

        /// \brief 获取尺寸线线宽
        /// \return 返回尺寸线线宽
        virtual LineWidth GetDimensionLineWidth() const = 0;

        /// \brief 设置尺寸线颜色
        /// \param dimColor 尺寸线颜色
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetDimensionLineColor(Color dimColor) = 0;

        /// \brief 获取尺寸线颜色
        /// \return 返回尺寸线颜色
        virtual Color GetDimensionLineColor() const = 0;

        /// \brief 设置尺寸线颜色索引值
        /// \param colorIndex 颜色索引值
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetDimensionLineColorIndex(int colorIndex) = 0;

        /// \brief 获取尺寸线颜色索引值
        /// \return 返回尺寸线颜色索引值
        virtual int GetDimensionLineColorIndex() const = 0;

        /// \brief 设置尺寸界线的超出尺寸线
        /// \param dimColor 超出尺寸线
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetDimensionBoundaryExtendLine(double dimExtendLine) = 0;

        /// \brief 尺寸界线的超出尺寸线
        /// \return 返回尺寸界线的超出尺寸线
        virtual double GetDimensionBoundaryExtendLine() const = 0;

        /// \brief 设置尺寸界线的线宽
        /// \param dimBoundaryWidth 线宽
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetDimensionBoundaryLineWidth(LineWidth dimBoundaryWidth) = 0;

        /// \brief 尺寸界线的线宽
        /// \return 返回尺寸界线的线宽
        virtual LineWidth GetDimensionBoundaryLineWidth() const = 0;

        /// \brief 设置尺寸线范围
        /// \param dimColor 超出尺寸线
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetDimensionLineExtendBeyondTicks(double dimExtendLine) = 0;

        /// \brief 尺寸线范围
        /// \return 返回尺寸线范围
        virtual double GetDimensionLineExtendBeyondTicks() const = 0;

        /// \brief 设置尺寸界线的颜色
        /// \param color 颜色
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetDimensionBoundaryLineColor(Color color) = 0;

        /// \brief 尺寸界线的颜色
        /// \return 返回尺寸界线的颜色
        virtual Color GetDimensionBoundaryLineColor() const = 0;

        /// \brief 设置尺寸界线的颜色索引值
        /// \param colorIndex 颜色索引值
        /// \return 返回true表示设置成功，否则设置失败
        virtual void SetDimensionBoundaryLineColorIndex(int colorIndex) = 0;

        /// \brief 尺寸界线的颜色索引值
        /// \return 返回尺寸界线的颜色索引值
        virtual int GetDimensionBoundaryLineColorIndex() const = 0;


    public:
        virtual ~IAlignedCADDimension();
    };


}


